import axios from 'axios'
import api from './config.js'
import qs from 'qs'
import {
    removeToken,
    getToken
} from '../store/storage.ts'
// vue项目引入路由
// import router from '../router/theme.ts'
// import { Message } from 'element-ui';  //element库的消息提示，可以不用
// 在main.js中引入两个文件
/*
import http from '@/plugins/http'
//挂载到VUE实例，以便全局使用
Vue.prototype.http = http
*/
// 多个loading合并为一个
let needLoadingRequestCount = 0
export function showLoading() {
    if (needLoadingRequestCount === 0) {
        uni.showLoading({
            title: '加载中...'
        })
    }
    needLoadingRequestCount++
}
export function hideLoading() {
    if (needLoadingRequestCount <= 0) return
    needLoadingRequestCount--
    if (needLoadingRequestCount === 0) {
        uni.hideLoading()
    }
}
// 环境
axios.defaults.baseURL = api.HostUrl
// 设置超时
axios.defaults.timeout = 50000
// post请求头
axios.defaults.headers.post['Content-Type'] = api.contentType
// 请求头加上token
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN
// 允许携带cookie
// axios.defaults.withCredentials = true
// 请求拦截器
axios.interceptors.request.use(
    config => {
        showLoading()
        // 每次发送请求之前判断是否存在token，如果存在，则统一在http请求的header都加上token，不用每次请求都手动添加了
        // const token = getToken()
        // // console.log('蛔别',token)
        // if (token) { // 判断是否存在token，如果存在的话，则每个http header都加上token
        //     config.headers['X-token'] = token
        // }
        if (config.method === 'post') {
            // post请求时，处理数据
            config.data = qs.stringify({
                ...config.data
                // 后台数据接收这块需要以表单形式提交数据，而axios中post默认的提交是json数据,所以这里选用qs模块来处理数据，也有其他处理方式，但个人觉得这个方式最简单好用
            })
        }
        console.log(config)
        return config
    },
    error => {
        return Promise.error(error)
    })
// 响应拦截器
axios.interceptors.response.use(
    response => {
        console.log(response)
        hideLoading()
        // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
        // 否则的话抛出错误
        console.log(response)
        if (response.status === 200) {
            if (response.data.status !== 200) {
                uni.showToast({
                    title: response.data.msg,
                    icon: 'none'
                })
            }
            // else {
            //     uni.showToast({
            //         title: response.data.msg
            //     })
            // }
            return Promise.resolve(response)
        } else {
            return Promise.reject(response)
        }
    },
    // 服务器状态码不是2开头的的情况
    // 这里可以跟你们的后台开发人员协商好统一的错误状态码
    // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
    error => {
        hideLoading()
        if (error.response.status) {
            return Promise.reject(error.response)
        }
    }
)
/**
 * request方法，对应request请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 * @method {String} 方法 [get | post | delete | put | head | patch]
 */
export const request = (url, method, params) => {
    method = method === undefined ? 'GET' : method
    return new Promise((resolve, reject) => {
        if ((method === 'GET')) {
            axios.get(url, {
                params: params
            }).then(res => {
                resolve(res.data);
            }).catch(err => {
                reject(err.data)
            })
        } else if(method === 'DELETE') {
            axios.delete(url,
                {params:params}
            ).then(res => {
                resolve(res.data)
            }).catch(err => {
                reject(err.data)
            })
        } else {
            axios({
                method: method,
                url: url,
                data: params // qs.stringify(params)
            }).then(res => {
                resolve(res.data)
            }).catch(err => {
                reject(err.data)
            })
        }
    })
}
/**
 * get方法，对应get请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export const get = (url, params) => {
    return new Promise((resolve, reject) => {
        axios.get(url, {
            params: params
        }).then(res => {
            resolve(res.data);
        }).catch(err => {
            reject(err.data)
        })
    })
}
/**
 * post方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export const post = (url, params = {}) => {
    return new Promise((resolve, reject) => {
        axios.post(url, params)
            .then(res => {
                resolve(res.data)
            })
            .catch(err => {
                reject(err.data)
            })
    })
}
 /**
 * 封装put请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export const put = (url,data = {}) => {
  return new Promise((resolve,reject) => {
    axios.put(url,data)
         .then(response => {
           resolve(response.data);
         },err => {
           reject(err)
         })
  })
}
/**
 * delet方法，对应delett请求
 * @param {String} url [请求的url地址]
 * delete关键字会和vue系统关键字冲突，所以这里用delet代替
 * delete用于删除，参数一般带在url
 */
export const delet = url => {
  return new Promise((resolve, reject) => {
    axios
      .delete(url)
      .then(res => {
        resolve(res.data)
      })
      .catch(err => {
        reject(err.data)
      })
  })
}
 /**
 * 封装patch请求
 * @param url
 * @param data
 * @returns {Promise}
 */

export const patch = (url,data = {}) => {
  return new Promise((resolve,reject) => {
    axios.patch(url,data)
         .then(response => {
           resolve(response.data);
         },err => {
           reject(err)
         })
  })
}
/**
 * upload方法，对应post请求
 * @param {String} url [请求的url地址]
 * @param {Object} params [请求时携带的参数]
 */
export const upload = (url, params) => {
    return new Promise((resolve, reject) => {
        axios.post(url, params, {
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        }).then(res => {
            resolve(res.data)
        }).catch(err => {
            reject(err.data)
        })
    })
}
export default axios
